package cn.edu.scnu.semart.goods.mapper;

import cn.edu.scnu.semart.model.goods.Goods;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import java.util.List;

/**
 * 商品Mapper接口
 */
@Mapper
public interface GoodsMapper extends BaseMapper<Goods> {

    /**
     * 搜索商品
     * @param page 分页参数
     * @param keyword 搜索关键词
     * @param categoryId 分类ID
     * @param minPrice 最低价格
     * @param maxPrice 最高价格
     * @param sortBy 排序字段
     * @param sortOrder 排序方向
     * @return 分页结果
     */
    IPage<Goods> searchGoods(Page<Goods> page,
                             @Param("keyword") String keyword,
                             @Param("categoryId") Integer categoryId,
                             @Param("minPrice") Double minPrice,
                             @Param("maxPrice") Double maxPrice,
                             @Param("sortBy") String sortBy,
                             @Param("sortOrder") String sortOrder,
                             @Param("auditStatus") Integer auditStatus,  // 新增审核状态参数
                             @Param("status") Integer status);           // 新增商品状态参数

    /**
     * 管理员搜索商品（返回所有审核状态的商品）
     */
    IPage<Goods> searchAllAuditStatusGoods(Page<Goods> page,
                                           @Param("keyword") String keyword,
                                           @Param("categoryId") Integer categoryId,
                                           @Param("minPrice") Double minPrice,
                                           @Param("maxPrice") Double maxPrice,
                                           @Param("sortBy") String sortBy,
                                           @Param("sortOrder") String sortOrder,
                                           @Param("auditStatus") Integer auditStatus);


    List<Goods> selectBatchByIds(@Param("ids") List<Integer> ids);


    int increaseStock(@Param("id") Integer id, @Param("num") Integer num);

    int reduceStock(@Param("id") Integer id,
                    @Param("num") Integer num,
                    @Param("expectedStock") Integer expectedStock);

    @Update("UPDATE goods SET likes = likes + 1 WHERE id = #{goodsId}")
    void incrementLikeCount(@Param("goodsId") Integer goodsId);

    @Update("UPDATE goods SET likes = likes - 1 WHERE id = #{goodsId}")
    void decrementLikeCount(@Param("goodsId") Integer goodsId);

    @Update("UPDATE goods SET favorites = favorites + 1 WHERE id = #{goodsId}")
    void incrementFavoriteCount(@Param("goodsId") Integer goodsId);

    @Update("UPDATE goods SET favorites = favorites - 1 WHERE id = #{goodsId}")
    void decrementFavoriteCount(@Param("goodsId") Integer goodsId);
} 